package com.jt.blog.service.impl;

import com.jt.blog.dao.TagMapper;
import com.jt.blog.domain.Tag;
import com.jt.blog.service.TagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;


import java.util.List;

@Service
public class TagServiceImpl implements TagService {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private TagMapper tagMapper;
    @Cacheable(value = "tagCache",key = "#targetClass.name")
    @Override
    public List<Tag> selectTags() {
        return tagMapper.selectList(null);

    }
    /**
     * 向数据库中再添加一个新的标签
     * @param tag
     * 思考:假如这里做了insert操作后,数据库中的数据更新了,
     * 也要更新redis缓存,你有什么方案?
     * 方案1:不更新redis,等redis的key失效后,自动更新.
     * 方案2:执行完insert,删除redis指定的key对应的数据
     * 方案3:执行完insert,更新redis指定key对应的内容
     * 说明:
     * @CacheEvict注解的作用是定义缓存切入点方法,执行此注解描述的方法
     * 时,底层通过AOP方式执行redis数据的清除操作.
     */

//    @CacheEvict(value = "tagCache",allEntries = true,beforeInvocation = false)
    @CachePut(value = "tagCache", key="#id")
    @Override
    public Tag insertTag(Tag tag) {
        tagMapper.insert(tag);
        return tag;


    }
    @Cacheable(value = "tagCache",key = "#id")
    @Override
    public Tag selectById(long id) {

        return tagMapper.selectById(id);
    }

    /**
     * @CachePut 注解描述的方法为一个缓存切入点方法,
     * 系统底层在执行此注解描述的方法时,可以对缓存数据
     * 执行更新操作.(底层会先基于key获取值,然后对值进行修改)
     * @param tag
     */

    @Cacheable(value = "tagCache",key = "#tag.id")
    @Override
    public Tag updateTag(Tag tag) {
        tagMapper.updateById(tag);
        return tag;

    }

    public Tag findById(Tag tag){
        return tag;
    }

//    @Override
//    public void insertTag(Tag tag){
//        System.out.println("insert.before="+tag);
//        tagMapper.insert(tag);
//        ValueOperations vo = redisTemplate.opsForValue();
//
//        List<LinkedHashMap> list = (List<LinkedHashMap>)vo.get("tagCache::SimpleKey []");
//        System.out.println("o="+list);
//        LinkedHashMap<Object, Object> map = new LinkedHashMap<>();
//        map.put("id", tag.getId());
//        map.put("name", tag.getName());
//        list.add(map);
//        vo.set("tagCache::SimpleKey []", list);
//
//    }

//    @Override
//    public List<Tag> selectTags() {
////        long before = System.currentTimeMillis();
//        //1.从redis查询Tag信息,redis有则直接返回
//        ValueOperations valueOperations =
//                redisTemplate.opsForValue();
//        Object tags=valueOperations.get("tags");
//        System.out.println("tags="+tags);
////        long redisAfter = System.currentTimeMillis();
////        System.out.println("redis.time="+(redisAfter-before));
//        if(tags!=null)return (List<Tag>)tags;
////        long before1 = System.currentTimeMillis();
//        //2.从redis没有获取tag信息，查询mysql
//        System.out.println("==select tags from mysql==");
//        List<Tag> dbTags =
//                tagMapper.selectList(null);
//        //3.将从mysql查询到tag信息存储到redis
//        valueOperations.set("tags", dbTags);
//        //4.返回查询结果
////        long after = System.currentTimeMillis();
////        System.out.println("mysql.time="+(after-before1));
//        return dbTags;
//    }
}
